今天來實際用看看Chroma
它是一個向量資料庫,
根據官方介紹它有以下特點
那到底多簡單呢?下面讓我們跟著一起來探索
pip install chromadb
import chromadb
chroma_client = chromadb.Client()
用來存embedding、文件、metadata的地方,可以創建很多個Collection每個都是獨立的,用名字來區分
collection = chroma_client.create_collection(name="my_collection")
把資料存進collection中,並且Chroma會自動處裡tokenization, embedding, indexing的部分
collection.add(
documents=["This is a document", "This is another document"],
metadatas=[{"source": "my_source"}, {"source": "my_source"}],
ids=["id1", "id2"]
)
如果你有自己的embedding模型,也可以處理好然後直接存向量如下
collection.add(
**embeddings=[[1.2, 2.3, 4.5], [6.7, 8.2, 9.2]],**
documents=["This is a document", "This is another document"],
metadatas=[{"source": "my_source"}, {"source": "my_source"}],
ids=["id1", "id2"]
)
query_texts 你要查的訊息,一樣的他會自動轉成向量並和你的資料做相似查詢
n_results 是返回幾筆結果
results = collection.query(
query_texts=["This is a query document"],
n_results=2
)
查詢結果 :
{'ids': [['id1', 'id2']], 'embeddings': None, 'documents': [['This is a document1', 'This is another document1']], 'metadatas': [[{'source': 'my_source'}, {'source': 'my_source'}]], 'distances': [[0.8226760625839233, 1.0733070373535156]]}
到這邊我們已經完成完整的向量相似查詢了 ! 是不是很簡單呢
要注意,當你第二次執行的時候不能用 collection = chroma_client.create_collection(name="my_collection")
因為這是創建的指令你應該用 get_collection()
collection = chroma_client.get_collection("my_collection")
但現在資料只是暫存而已,無法保存,當你把程式關掉後就都沒了。
這時我們就必須用到下面的方法
persist_directory 看你想要保存在哪,這裡其實就是修改我們步驟2在後面增加
from chromadb.config import Settings
client = chromadb.Client(Settings(
chroma_db_impl="duckdb+parquet",
persist_directory="/path/to/persist/directory" # Optional, defaults to .chromadb/ in the current directory
))
下面是官方特別提到的注意事項
一次只使用一個Client
同時擁有許多In-Memory的Client,它們載入和保存到相同的路徑可能會導致奇怪的行為,包括資料刪除。作為一般慣例,在應用程式中只建立一個記憶體中的 Chroma 客戶端,並將其傳遞而不是建立許多客戶端。
今天我們實際玩了Chroma
相信各位對向量資料庫又更加了解了
也體會到使用起來有多麼簡單快速
那如果要套用進我們之前的聊天機器人流程就是
資料 -> collection.add 存進向量資料庫 -> collection.query 找到相關的QA資料 -> 使用這筆資料做上下文
最後如果有使用上的疑問歡迎留言或來群組一起討論
https://discord.gg/wVX3vfMF3j
參考:
https://www.trychroma.com/